package com.powernode.service;

import com.alibaba.fastjson.JSONObject;
import com.powernode.config.JdwxSmsConfig;
import com.powernode.constants.RedisKey;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

/**
 * 提供发送短信对应的方法
 */
@Service
public class SmsService {
    @Autowired
    private JdwxSmsConfig jdwxSmsConfig;

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    /*验证码是否存在*/
    public boolean checkCodeIsUse(String phone, String cmd) {
        /*根据不同的操作  判断 是否有对应的验证码*/
        if ("reg".equals(cmd)){
            /*注册验证*/
           return  stringRedisTemplate.hasKey(RedisKey.YLB_REGISTER_CODE + phone);
        }else if("login".equals(cmd)){
            /*登录验证*/
            return  stringRedisTemplate.hasKey(RedisKey.YLB_LOGIN_CODE + phone);
        }
        /*实名认证*/
        return false;
    }

    /**
     * 处理验证码
     * 根据cmd 的不同 发送 保存 不同的 验证码
     * @param phone
     * @param cmd
     * @return
     */
    public boolean sendSmsCode(String phone, String cmd) {
        /*调用 第三方 接口 */

        if ("reg".equals(cmd)){
            /*注册*/
            /*1 生成 随机的 验证码  6 位数字字符串*/
            String code = RandomStringUtils.randomNumeric(6);
            /*2 发送验证码*/
            boolean result  = handlerSendSmsCode(phone, code);
            if (result){
                /*3 保存到redis中  phone 作为key*/
                stringRedisTemplate.boundValueOps(RedisKey.YLB_REGISTER_CODE+phone).set(code,3, TimeUnit.MINUTES);
                return true;
            }

        }else if ("login".equals(cmd)){
            /*登录*/
            String code = RandomStringUtils.randomNumeric(6);
            /*如果发送短信成功*/
            boolean result  = handlerSendSmsCode(phone, code);
            if (result){
                stringRedisTemplate.boundValueOps(RedisKey.YLB_LOGIN_CODE+phone).set(code,3, TimeUnit.MINUTES);
                return true;
            }
        }

        return false;
    }

    /*发送短信*/
    private boolean handlerSendSmsCode(String phone,String code){
        /*1 替换 占位符  %s*/
        String content = String.format(jdwxSmsConfig.getContent(), code);
        System.out.println("content:"+content);
        /*2 处理 url*/
        String url = jdwxSmsConfig.getUrl()
                +"?mobile="+phone
                +"&content="+content
                +"&appkey="+jdwxSmsConfig.getAppkey();
        System.out.println("url:"+url);
        /*3 调用第三方接口*/
        CloseableHttpClient client = HttpClients.createDefault();
        HttpGet get = new HttpGet(url);
        try {
            CloseableHttpResponse response = client.execute(get);
            /*4 判断是否响应成功*/
            if (response.getStatusLine().getStatusCode()!= HttpStatus.SC_OK){
                return false;
            }
            /*获取 响应 数据*/
            HttpEntity entity = response.getEntity();
            String json = EntityUtils.toString(entity);
            /*为了不充钱 写死 json*/
            json="{\n" +
                    "    \"code\": \"10000\",\n" +
                    "    \"charge\": false,\n" +
                    "    \"remain\": 1305,\n" +
                    "    \"msg\": \"查询成功\",\n" +
                    "    \"result\": {\n" +
                    "        \"ReturnStatus\": \"Success\",\n" +
                    "        \"Message\": \"ok\",\n" +
                    "        \"RemainPoint\": "+code+",\n" +
                    "        \"TaskID\": 18424321,\n" +
                    "        \"SuccessCounts\": 1\n" +
                    "    }\n" +
                    "}";
            System.out.println("json:"+json);
            /*5解析json数据   判断 返送短信的结果*/
            JSONObject jsonObject = JSONObject.parseObject(json);
            if (!"10000".equals(jsonObject.getString("code"))){
                return false;
            }
            if (!"Success".equals(jsonObject.getJSONObject("result").getString("ReturnStatus"))){
                return false;
            }
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }finally {
            try {
                client.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return true;
    }

    /**
     * 拿 用户输入的 验证码 与 redis中 储存的 验证码 比较
     * @param phone 用户上输入的手机号码
     * @param code  用户输入的验证码
     * @return
     */
    /*注册验证码 验证*/
    public boolean checkRegisterCode(String phone,String code){
        /*redis中key*/
        String key = RedisKey.YLB_REGISTER_CODE+phone;
        /*redis中储存的对应的 验证码*/
        String saveCode = stringRedisTemplate.boundValueOps(key).get();
        if (saveCode.equals(code)){
            return true;
        }
        return false;
    }

    /*登录验证码 验证*/
    public boolean checkLoginCode(String phone,String code){
        /*redis中key*/
        String key = RedisKey.YLB_LOGIN_CODE+phone;
        /*redis中储存的对应的 验证码*/
        String saveCode = stringRedisTemplate.boundValueOps(key).get();
        if (saveCode.equals(code)){
            return true;
        }
        return false;
    }
}
